# 单纯的重复，不能算作是迭代
"""i = 0
while True:
    print(i)"""
#迭代是基于上一次的结果而来的
"""l = ['a','b','c']
i = 0
while i < len(l): # 表达式，是i小于数组的长度开始遍历，什么时候i大于等于了数组的长度就停止
    print(i)
    print(l[i])
    "
    i+=1 # while循环的循环变量，不能丢，丢了就是死循环"""
"""
第一次循环：i是0，l[0]是a
第二次循环：i是1，l[1]是b
第三次循环：i是2，l[2]是c
"""
# 哪些数据类型需要这样迭代取值?
# 字符串 、列表、元组、集合、文件（还没学）
"""a = "abc"
l1 = ['a','b','c']
t = (1,2,3)
s = {55,99,66}
i = 0
dic = {"姓名":"张三","年龄":19} # 除了这个"""
"""while i< len(t):
    print(i)
    print(t[i])
    i+=1"""
"""while i<len(dic):
    print(i) # 0 1
    print(dic[i]) # dic[0]
    i+=1"""
# 可迭代对象。__iter__()创建迭代器，如果没有这个方法的，说明这个数据类型不支持迭代
a = 1
# a.__iter__() # 没有这个方法。int类型不支持迭代
b = 1.1
# b.__iter__() # 没有这个方法。float类型不支持迭代
c = "hello"
# c.__iter__() # 有这个方法。str类型支持迭代
d = ['a','c']
# d.__iter__() # 有这个方法。list类型支持迭代
g = {1,2,3}
# g.__iter__() # 有这个方法。set类型支持迭代
"""
dic = {"x":1,"y":2,"z":3}
iter_dic = dic.__iter__() # 创建了一个迭代器
# print(iter_dic) # 迭代器的地址值
print(iter_dic.__next__()) # 取下一个值：x
print(iter_dic.__next__()) # 取下一个值：y
print(iter_dic.__next__()) # 取下一个值：z
print(iter_dic.__next__()) # StopIteration，直接报错
"""
"""l = [1,2,3]
iter_l = l.__iter__()
# print(iter_l) # 地址值
print(iter_l.__next__()) # 1
print(iter_l.__next__()) # 2
print(iter_l.__next__()) # 3
print(iter_l.__next__()) # StopIteration"""
# 误区
# 下面的代码，永远都是创建了一个新的迭代器，然后永远访问第一位
"""l = [1,2,3]
print(l.__iter__().__next__()) 
print(l.__iter__().__next__()) 
print(l.__iter__().__next__()) 
print(l.__iter__().__next__()) 
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())
print(l.__iter__().__next__())"""

# iter和next是组成了迭代器协议
dic = {"x":1,"y":2,"z":3}
iter_dic = dic.__iter__()
"""print(next(iter_dic)) # next和__next__()是一样的作用：x
print(next(iter_dic)) # y
print(next(iter_dic)) # z
print(next(iter_dic)) # 报错：StopIteration"""
# 为了解决上面的错误，用异常捕获来进行
"""while True:
    try:
        print(next(iter_dic))
    except StopIteration:
        break"""
# print("已经取空啦！")

# for循环很好的解决了上述问题，取到了最后一个，再去取的不会报错
"""for i in dic:
    print(i)"""
"""
for循环底层做了很多事：
1、他会自动创建一个迭代器对象（遍历的数据类型支持迭代）
2、每次遍历访问都是基于上一次结果而来（加了next方法去访问的）
3、拿到最后一个值以后，再去取的时候，做了异常捕获，所以我们感知不到它报错了
"""
"""
obj = range(1,10)
obj_iter = obj.__iter__()
print(obj_iter.__next__()) # 1
print(obj_iter.__next__()) # 2
print(obj_iter.__next__()) # 3
print(obj_iter.__next__()) # 4
print('迭代器的for循环下了三个鸡蛋的母鸡')
for i in obj_iter:
    # 1还是4？
    print(i)
print("再次")
for i in obj_iter:
    print(i)
"""

# 生成器
def gg():
    a = 1
    while True: # 用了while True，所以可以通过next取额外的两次，否则就是迭代一次
        yield a # 你可以把他当成return
        a += 1
aci = gg()
print(next(aci)) # 1
print(next(aci)) # 2
print(next(aci)) # 3













